<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
   
      <title>C.3. Recomendaciones y generalidades sobre integraci&oacute;n gvHidra y Jasper</title>
      <meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2">
      <link rel="home" href="indice.html" title="Manual Usuario gvHidra">
      <link rel="up" href="apc.html" title="Ap&eacute;ndice C. Listados Jasper en gvHIDRA">
      <link rel="prev" href="apcs02.html" title="C.2. Depuraci&oacute;n de errores al intentar ejecutar informes JasperReports en gvHidra">
   </head>
   <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
      <div class="navheader">
         <table width="100%" summary="Navigation header">
            <tr>
               <th colspan="3" align="center">C.3. Recomendaciones y generalidades sobre integraci&oacute;n gvHidra y Jasper</th>
            </tr>
            <tr>
               <td width="20%" align="left"><a accesskey="p" href="apcs02.html">Anterior</a>&nbsp;
               </td>
               <th width="60%" align="center">Ap&eacute;ndice C. Listados Jasper en gvHIDRA</th>
               <td width="20%" align="right">&nbsp;</td>
            </tr>
         </table>
         <hr>
      </div>
      <div class="section" title="C.3. Recomendaciones y generalidades sobre integraci&oacute;n gvHidra y Jasper">
         <div class="titlepage">
            <div>
               <div>
                  <h2 class="title" style="clear: both"><a name="d4e8540"></a>C.3. Recomendaciones y generalidades sobre integraci&oacute;n gvHidra y Jasper
                  </h2>
               </div>
            </div>
         </div>
         
         <p>Los par&aacute;metros en Jasper Reports se pueden dar de alta desde:</p>
         
         
         <div class="itemizedlist">
            <ul class="itemizedlist" type="disc">
               <li class="listitem">
                  <p>Menu Ver / Par&aacute;metros del Informe / Bot&oacute;n Nuevo</p>
               </li>
               <li class="listitem">
                  <p>Panel de 'Librer&iacute;a', seleccionamos Par&aacute;metros y con bot&oacute;n derecho "Nuevo Par&aacute;metro"</p>
               </li>
            </ul>
         </div>
         
         
         <p>Los par&aacute;metros de Jasper, pueden ser de 2 tipos, siendo referenciados dentro del informe Jasper con un formato distinto para
            cada tipo.
         </p>
         
         
         <p>A los par&aacute;metros les podemos especificar un nombre, tipo y un valor por defecto. Si marcamos el check "use as prompt", cuando
            ejecutemos el informe desde dentro del entorno iReports, nos pedir&aacute; que le demos un valor cada vez que lo ejecutemos, d&aacute;ndonos
            tambi&eacute;n la opci&oacute;n de asignarle al par&aacute;metro el valor por defecto que hayamos especificado.
         </p>
         
         
         <div class="itemizedlist">
            <ul class="itemizedlist" type="disc">
               <li class="listitem">
                  
                  <p>FORMATO A: $P{Nombre_Par&aacute;metro}</p>
                  
                  <div class="itemizedlist">
                     <ul class="itemizedlist" type="circle">
                        <li class="listitem">
                           
                           <p>Este par&aacute;metro podr&aacute; ser utilizado tanto en la Select, como en cualquier variable calculada o en las diferentes expresiones
                              Java que Jasper permite introducir.
                           </p>
                           
                        </li>
                        <li class="listitem">
                           
                           <p>Las expresiones en las que se puede utilizar son:</p>
                           
                           <div class="itemizedlist">
                              <ul class="itemizedlist" type="square">
                                 <li class="listitem">
                                    	
                                    <p>en las propiedades de los campos que se colocan en el informe, en concreto son "Print When expression" y "text Field expression"</p>
                                    
                                 </li>
                                 <li class="listitem">
                                    	
                                    <p>en la expresi&oacute;n "Print When expression" de las bandas de las que consta el informe</p>
                                    
                                 </li>
                              </ul>
                           </div>
                           
                        </li>
                        <li class="listitem">
                           
                           <p>La ventaja de este sistema es que como el par&aacute;metro tiene un tipo, cualquier expresi&oacute;n Java que utilice el par&aacute;metro podr&aacute;
                              ser comprobada por Jasper cuando se compile el informe, y por tanto se nos informar&aacute; de todos los errores en tiempo de compilaci&oacute;n.
                           </p>
                           
                        </li>
                     </ul>
                  </div>
                  
               </li>
            </ul>
         </div>
         
         
         <p>Se pueden crear tantos par&aacute;metros de tipo $P{Nombre_Par&aacute;metro} como se necesiten en el informe.</p>
         
         <p>En muchas ocasiones la aplicaci&oacute;n PHP presentar&aacute; una pantalla de selecci&oacute;n de datos en la que NO ser&aacute; obligatorio especificar
            todos los campos (que se pasan al informe Jasper como par&aacute;metros ).
         </p>
         
         <p>Cuando en esta pantalla de selecci&oacute;n de datos se deja en blanco un campo, se entiende que se solicitan todos los registros,
            contengan lo que contengan.
         </p>
         
         <p>Para estos par&aacute;metros opcionales existe la posibilidad de escribir el WHERE de la select de la forma siguiente, suponiendo
            que "titulo" es un parametro opcional y su valor por defecto se ha fijado a "null": tddm_expediente.codtit = COALESCE($P{titulo},tddm_expediente.codtit)
         </p>
         
         <p>Este "truco" NO funcionar&aacute; bien cuando la columna en cuesti&oacute;n (tddm_expediente.codtit) admita el valor NULL, en cuyo caso
            NO se debe utilizar este sistema.
         </p>
         
         <p>El m&eacute;todo anterior se basa en que el par&aacute;metro $P{titulo} tiene valor por defecto "null", por lo que cuando no se pasa $P{titulo}
            se queda a null y como la funci&oacute;n SQL COALESCE devuelve el primer valor no nulo, devolver&aacute; el segundo par&aacute;metro reduci&eacute;ndose
            la condici&oacute;n a tddm_expediente.codtit = tddm_expediente.codtit, que es una operaci&oacute;n trivial que devuelve TRUE... excepto
            cuando el valor de tddm_expediente.codtit sea NULL, por que sql considera que ( NULL = NULL ) NO devuelve Verdadero ( sino
            que devuelve NULL ), el resultado es que aquellas filas que contengan NULL se pierden porque no pueden satisfacer la condici&oacute;n.
         </p>
         
         <p>La soluci&oacute;n en este caso pasa por utilizar la otra forma alternativa de par&aacute;metros que tiene JasperReports, el formato B.</p>
         
         
         <div class="itemizedlist">
            <ul class="itemizedlist" type="disc">
               <li class="listitem">
                  
                  <p>FORMATO B: $P!{Nombre_Par&aacute;metro}</p>
                  
                  <p>Este par&aacute;metro se da de alta como un par&aacute;metro normal, pero deber&aacute; tener siempre el tipo de valor "java.lang.String" y el
                     valor por defecto a "". Lo que cambia es la forma de referenciarlo en el informe que ser&aacute; siempre como $P!{Nombre_Par&aacute;metro}.
                  </p>
                  
               </li>
            </ul>
         </div>
         
         
         <p>Los par&aacute;metros $P!{Nombre_Par&aacute;metro} se interpretan antes que los par&aacute;metros $P{Nombre_Par&aacute;metro}, por tanto, en teor&iacute;a, es
            posible que la cadena que pasemos como valor de $P!{Nombre_Par&aacute;metro} contenga a su vez expresiones que deban ser posteriormente
            calculadas o pasadas desde otra fuente. Se supone que podr&iacute;amos llegar a incluir un par&aacute;metro de formato A $P{Nombre_Par&aacute;metro}
            dentro del valor que pasemos a una cadena de formato B $P!{Nombre_Par&aacute;metro}, si bien, esto no es &uacute;til en gvHidra ya que toda
            la informaci&oacute;n de selecci&oacute;n de datos se introduce en una misma pantalla previa al lanzamiento del informe, aunque puede serlo
            en otros contextos.
         </p>
         
         
         <p>Los par&aacute;metros $P!{Nombre_Par&aacute;metro} permiten modificar la cadena SQL que sirve de base para el informe. En concreto pueden
            contener:
         </p>
         
         
         <div class="orderedlist">
            <ol class="orderedlist" type="1">
               <li class="listitem">
                  	
                  <p>La totalidad de la sentencia SQL en la que se basa el informe: en ese caso el informe solo contiene en su clausula base: $P!{CadSQL}</p>
                  	
               </li>
               <li class="listitem">
                  	
                  <p>Una clausula completa de las que componene una sentencia SQL, como por ejemplo "ORDER BY 1,2" o "WHERE tddm_expediente.codtit='PAYA"</p>
                  	
               </li>
               <li class="listitem">
                  	
                  <p>Una parte de alguna clausula de las que componene una sentencia SQL, por ejemplo (dentro de la clausula WHERE ) " AND tddm_expediente.codtit='PAYA'
                     ". Para utilizar esta &uacute;ltima soluci&oacute;n, en la sentencia SQL debemos a&ntilde;adir un par&aacute;metro $P!{CadenaWhereOpcional} al final de
                     la cla&uacute;sula WHERE:
                  </p>
                  	
                  <div class="itemizedlist">
                     <ul class="itemizedlist" type="disc">
                        <li class="listitem">
                           			
                           <p>cuando el usuario no especifique un valor para el campo opcional "codigo titulo", el par&aacute;metro $P!{CadenaWhereOpcional} se
                              pasar&aacute; como cadena vac&iacute;a
                           </p>
                           		
                        </li>
                        <li class="listitem">
                           			
                           <p>cuando el usuario rellene por ejemplo el par&aacute;metro opcional "codigo titulo" con el valor "PAYA" el par&aacute;metro $P!{CadenaWhereOpcional}
                              tomar&aacute; el valor "AND tddm_expediente.codtit='PAYA' "
                           </p>
                           		
                        </li>
                     </ul>
                  </div>
                  	
               </li>
            </ol>
         </div>
         
         
         <p>La soluci&oacute;n 1, ofrece la ventaja de que toda la sentencia sql puede venir de nuestra aplicaci&oacute;n PHP, esto es &uacute;til cuando el
            programa tambi&eacute;n deba utilizar la sentencia SQL para por ejemplo, comprobar que existe alg&uacute;n registro con las condiciones
            introducidas. Basta con que la versi&oacute;n de la sentencia SQL que se utiliza en la aplicaci&oacute;n PHP a&ntilde;ada un "LIMIT 1" para que
            s&oacute;lo se intente recuperar 1 registro como m&aacute;ximo, y en caso de que aparezca 1 registro, se pasa la cadena sin el LIMIT 1 al
            informe.
         </p>
         
         
         <p>Esta t&eacute;cnica EST&Aacute; RECOMENDADA para los casos en los que la aplicaci&oacute;n compruebe que hay registros que cumplen las condiciones
            porque facilita el mantenimiento de las consultas, ya que si hay alg&uacute;n cambio o correcci&oacute;n posterior de alg&uacute;n error, la consulta
            se modificar&aacute; s&oacute;lo en un sitio, y no habr&aacute; inconsistencias entre la consulta de la aplicaci&oacute;n PHP y la de JasperReports.
         </p>
         
         
         <p>Cuando no se especifica la consulta del informe, JasperReports s&oacute;lo comprobar&aacute; la cadena SQL en tiempo de ejecuci&oacute;n cuando
            la reciba y adem&aacute;s iReports no puede recuperar autom&aacute;ticamente los campos disponibles para dise&ntilde;ar el informe. Pero esto se
            puede conseguir de dos formas:
         </p>
         
         
         <div class="itemizedlist">
            <ul class="itemizedlist" type="disc">
               <li class="listitem">
                  		
                  <p>Desactivando la opci&oacute;n de "Recuperaci&oacute;n autom&aacute;tica de los campos", luego copiando toda la select, (ATENCI&Oacute;N: iReports la va
                     a ejecutar, por lo que debemos filtrar por algun campo en la clausula WHERE o a&ntilde;adir al final un LIMIT 1 para que NO se descargue
                     toda la Base de Datos !! Puesto que si se baja demasiados datos se nos puede quedar sin memoria o estar mucho rato sin respondernos)
                     y finalmente pulsando el bot&oacute;n de "Leer Campos" lo que crear&aacute; autom&aacute;ticamente todos los campos devueltos por la select.
                  </p>
                  	
               </li>
               <li class="listitem">
                  		
                  <p>Creando manualmente todos los campos, con sus respectivos tipos. Recordad que Java distingue las may&uacute;sculas de las min&uacute;sculas
                     por lo que hay que ce&ntilde;irse a los nombre de los campos que devuelva la select que vamos a pasar
                  </p>
                  	
               </li>
            </ul>
         </div>
         
         <p>En el caso de que el mantenimiento sea de tipo Maestro/Detalle, si el listado se lanza desde una ventana que tiene par&aacute;metros
            opcionales, se puede aplicar al informe Maestro todas las soluciones anteriores para pasarle los par&aacute;metros opcionales, en
            concreto para los casos en los que se compruebe que existen registros que cumplan las condiciones introducidas en la pantalla
            de selecci&oacute;n, se recomienda utilizar un par&aacute;metro con el FORMATO B: $P!{Nombre_Par&aacute;metro} y con la soluci&oacute;n A, mientras que
            el Detalle puede llevar la SQL en el propio informe, ya que es la consulta Maestra la que decide qu&eacute; registros se van a mostrar.
         </p>
         
      </div>
      <div class="navfooter">
         <hr>
         <table width="100%" summary="Navigation footer">
            <tr>
               <td width="40%" align="left"><a accesskey="p" href="apcs02.html">Anterior</a>&nbsp;
               </td>
               <td width="20%" align="center"><a accesskey="u" href="apc.html">Subir</a></td>
               <td width="40%" align="right">&nbsp;</td>
            </tr>
            <tr>
               <td width="40%" align="left" valign="top">C.2. Depuraci&oacute;n de errores al intentar ejecutar informes JasperReports en gvHidra&nbsp;</td>
               <td width="20%" align="center"><a accesskey="h" href="indice.html">Inicio</a></td>
               <td width="40%" align="right" valign="top">&nbsp;</td>
            </tr>
         </table>
      </div>
   </body>
</html>